package myjdbc;

import java.sql.*;

/**
 * @Auther: cty
 * @Date: 2020/1/19 11:22
 * @Description:  测试批处理
 * 注意：
 * （1）对于大量的批处理，建议使用Statement，因为PreparedStatement的预编译空间有限
 * ，当数据量特别大时，会发生异常。
 * （2）设置为手动提交
 *
 * @version: 1.0
 */
public class JDBC_Demo04_Batch {

    public static final String URL = "jdbc:mysql://localhost:3306/testjdbc";
    public static final String USER = "root";
    public static final String PASSWORD = "123456";

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1. 加载MySQL驱动程序
        Class.forName("com.mysql.jdbc.Driver");  // 1

        //2. 获得数据库连接
        Connection conn = DriverManager.getConnection(URL,USER,PASSWORD);  // 2

        //3. 操作数据库，实现增删改查
        long start = System.currentTimeMillis();

        conn.setAutoCommit(false);  //设置为手动提交

        Statement stmt = conn.createStatement();  // 3.1 获取Statement对象
        for(int i=0;i<20000;i++){
            stmt.addBatch("insert into user(username,pwd,regTimestamp,infoVarchar) values('cty"+i+"',123,now(),'test batch')");
        }
        int[] rs = stmt.executeBatch();  // 3.2 批处理执行SQl语句
        conn.commit();  //手动提交事务

        long end = System.currentTimeMillis();
        System.out.println("存入20000条记录耗时："+(end-start)+"ms");  // 插入20000条记录耗时：1979ms

        //4. 处理返回数据
        int count = 0;
        for(int i=0; i<rs.length; i++){
            count += rs[i];
        }
        System.out.println(count);

        //5. 关闭连接
        if(stmt!=null){
            stmt.close();
        }
        if(conn!=null){
            conn.close();
        }
    }
}

/* res:
存入20000条记录耗时：1920ms
20000
*/